#ifndef __OLED_I2C_Buffer_H
#define	__OLED_I2C_Buffer_H
#include "stm32f10x.h"

//基础引脚和配置
#define OLED_PIXEL_X 128			//屏幕像素 X_MAX
#define OLED_PIXEL_Y 64				//屏幕像素 Y_MAX

#define OLED_ADDRESS	0x78 //通过调整0R电阻,屏可以0x78和0x7A两个地址 -- 默认0x78
#define OLED_CMD 0x00		  //是否命令, 命令寄存器地址
#define OLED_DATA 0x40		//是否数据 数据寄存器地址

#define OLED_HardWare_IIC		I2C1		//定义硬件I2C
#define OLED_I2C_RCC_Periph		RCC_APB1Periph_I2C1   //定义硬件I2C RCC
#define OLED_GPIO_RCC_Periph	RCC_APB2Periph_GPIOB  //定义硬件I2C 引脚时钟
#define OLED_IIC_GPIO			GPIOB     //定义硬件I2C 引脚
#define OLED_SCL				GPIO_Pin_6  //定义I2C_SCL 引脚
#define OLED_SDA				GPIO_Pin_7  //定义I2C_SDA 引脚

#define OLED_LED_LIGHTUP 1			//画点填充宏定义
#define OLED_LED_EXTINGUISH 0		//画点清除宏定义

#define OLED_DISPLAYCHAR_NORMAL 1	//正常显示
#define OLED_DISPLAYCHAR_REVERSE 0	//反白显示

/*	
OLED_Memory_Addressing_Mode
页地址模式(A[1:0]=10b)
当处于此模式时, 在GDDRAM访问后(读/写), 列地址指针将自动增加1。如果列地址指针到达列终止地址, 列地址指针将复位到列起始地址, 但页地址指针不会改变。
水平地址模式(A[1:0]=00b)
当处于此模式时, 在GDDRAM访问后(读/写), 列地址指针将自动增加1。如果列地址指针到达列终止地址, 列地址指针将复位到列起始地址, 且页地址指针将自动增加1。
*/
#define OLED_Memory_Addressing_Mode  0x00		//设置为水平地址模式  以便快速一次性传输显存数据	以IIC400Kbps可达到40+帧率

//是否使用DMA传输(速度快),不使用就注释掉这个宏定义
#define OLED_DMA_Trans         1

//配置dma相关函数
void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr);
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx);



//硬件i2c相关函数
void I2C_Configuration(void);			//I2C初始化配置
void I2C_WriteByte(uint8_t addr,uint8_t data);  //写byte数据到i2c上
void OLED_Init(void);					//OLED初始化配置
void TIM_Int_Init();	//定时刷新显存定时器配置


//oled功能相关函数
void OLED_ON(void);						//OLED打开屏幕
void OLED_OFF(void);					//OLED关闭屏幕

void OLED_DrawPoint(u8 x,u8 y,u8 t);	//OLED画点函数
void OLED_Refresh_OneTime(void);		//一次I2C通信刷新全部显存至GDDRAM 快
void OLED_Clear(void);					//OLED清除显存数据 全部置为0x00 并刷新屏幕
void OLED_RamClear(void);				//OLED清除显存数据 全部置为0x00

void OLED_DrawLine(int x1,int y1,int x2,int y2,int color); //划线
void OLED_DrawCircle(int x, int y, int r, int color);  //画圆函数
void OLED_DrawRectangle(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode); //画正方形
void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);	 //填充区域

void OLED_ShowINT(u8 x, u8 y, int num, u8 size, u8 mode);  //显示数字
void OLED_ShowFLOAT(u8 x, u8 y, float num, u8 pointNum,u8 size, u8 mode);  //显示浮点数

void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode); //显示字符
void OLED_ShowString(u8 x,u8 y,const u8 *p,u8 size,u8 mode); //显示字符串
void OLED_Show16X16oneCN(uint8_t X, uint8_t Y, char *Chinese, u8 mode); //显示中文
void OLED_ShowImage(uint8_t X, uint8_t Y, uint8_t Width, uint8_t Height, const uint8_t *Image); //显示图片


/*中文字符字节宽度*/
#define OLED_CHN_CHAR_WIDTH			3		//UTF-8编码格式给3，GB2312编码格式给2

/*字模基本单元*/
typedef struct 
{
	char Index[OLED_CHN_CHAR_WIDTH + 1];	//汉字索引
	uint8_t Data[32];						//字模数据 使用32个字节
} ChineseCell_t;

/*ASCII字模数据声明*/
extern const uint8_t OLED_F8x16[][16];
extern const uint8_t OLED_F6x8[][6];

/*汉字字模数据声明*/
extern const ChineseCell_t OLED_CF16x16[];

/*图像数据声明*/
extern const uint8_t Diode[];
extern const uint8_t Nonside[];
extern const uint8_t dinosaurBMP1[];
extern const uint8_t dinosaurBMP2[];
extern const uint8_t cloudBMP[];
extern const uint8_t cactusBMP[];
/*按照上面的格式，在这个位置加入新的图像数据声明*/

//其他函数
unsigned char *reverse(unsigned char *s);
unsigned char *my_itoa(long n);
unsigned char *my_strcat(u8 * str1, u8 * str2);

#endif